package br.com.linkcom.sined.geral.dao;

import java.util.List;

import br.com.linkcom.neo.controller.crud.FiltroListagem;
import br.com.linkcom.neo.persistence.DefaultOrderBy;
import br.com.linkcom.neo.persistence.QueryBuilder;
import br.com.linkcom.neo.persistence.SaveOrUpdateStrategy;
import br.com.linkcom.sined.geral.bean.Filme;
import br.com.linkcom.sined.geral.bean.Usuario;
import br.com.linkcom.sined.modulo.sistema.controller.crud.filter.FilmeFiltro;
import br.com.linkcom.sined.util.neo.persistence.GenericDAO;

@DefaultOrderBy("filme.titulo asc")
public class FilmeDAO extends GenericDAO<Filme>{

	@Override
	public void updateListagemQuery(QueryBuilder<Filme> query, FiltroListagem _filtro) {
		
		FilmeFiltro filtro = (FilmeFiltro) _filtro;
		
		query
			.select("filme.cdfilme, filme.titulo, filme.genero")
			.whereLikeIgnoreAll("filme.titulo", filtro.getTitulo())
			.where("filme.genero=?", filtro.getGenero())
			.orderBy("filme.titulo");
	}
	
	@Override
	public void updateEntradaQuery(QueryBuilder<Filme> query) {
		query.leftOuterJoinFetch("filme.listaFilmeator listaFilmeator");
		query.leftOuterJoinFetch("listaFilmeator.ator ator")
		.orderBy("ator.nome");
	}
	
	@Override
	public void updateSaveOrUpdate(SaveOrUpdateStrategy save) {
		save.saveOrUpdateManaged("listaFilmeator");
	}
	
	public List<Filme> findForRecomendarFilme(Usuario usuario){
		return query()
			.leftOuterJoinFetch("filme.listaFilmeator listaFilmeator")
			.leftOuterJoinFetch("listaFilmeator.ator ator")
			.where("filme.cdfilme not in (select f.cdfilme" +
				   "					  from Usuariofilme uf" +
				   "					  join uf.usuario u" +
				   "					  join uf.filme f" +
				   "					  where u=?)", usuario)
			.openParentheses() 	   
				.where("ator.cdator in (select a.cdator" +
					   "				from Usuarioator ua" +
				       "				join ua.ator a" +
				       "				join ua.usuario u1" +
				       "				where u1=?)", usuario)
				.or()
				.where("filme.genero in (select ug.genero" +
				       "				 from Usuariogenero ug" +
				       "				 join ug.usuario u2" +
				       "				 where u2=?)", usuario)
			.closeParentheses()
			.setMaxResults(10)
			.list();
	}	
}